// Copyright Epic Games, Inc. All Rights Reserved.

#pragma once

#include "ModularPawn.h"
#include "Teams/LyraTeamAgentInterface.h"

#include "LyraPawn.generated.h"

#define UE_API LYRAGAME_API

class AController;
class UObject;
struct FFrame;

/**
 * ALyraPawn
 */
UCLASS(MinimalAPI)
class ALyraPawn : public AModularPawn, public ILyraTeamAgentInterface
{
	GENERATED_BODY()

public:

	/**
	 * 构造函数
	 */
	UE_API ALyraPawn(const FObjectInitializer& ObjectInitializer = FObjectInitializer::Get());

	//~AActor 接口
	/**
	 * 预初始化组件
	 */
	UE_API virtual void PreInitializeComponents() override;
	/**
	 * 结束游戏
	 */
	UE_API virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;
	//~AActor 接口结束

	//~APawn 接口
	/**
	 * 被控制器拥有时调用
	 */
	UE_API virtual void PossessedBy(AController* NewController) override;
	/**
	 * 取消拥有时调用
	 */
	UE_API virtual void UnPossessed() override;
	//~APawn 接口结束

	//~ILyraTeamAgentInterface 接口
	/**
	 * 设置通用团队ID
	 */
	UE_API virtual void SetGenericTeamId(const FGenericTeamId& NewTeamID) override;
	/**
	 * 获取通用团队ID
	 */
	UE_API virtual FGenericTeamId GetGenericTeamId() const override;
	/**
	 * 获取团队索引改变委托
	 */
	UE_API virtual FOnLyraTeamIndexChangedDelegate* GetOnTeamIndexChangedDelegate() override;
	//~ILyraTeamAgentInterface 接口结束

protected:
	/**
	 * 在拥有结束时确定新的团队ID
	 */
	virtual FGenericTeamId DetermineNewTeamAfterPossessionEnds(FGenericTeamId OldTeamID) const
	{
		// 这可以更改为返回，例如，OldTeamID，如果你想在之后保持分配，或者返回某个中立派系的ID，等等...
		return FGenericTeamId::NoTeam; // 返回无团队
	}

private:
	/**
	 * 控制器改变团队时调用
	 */
	UFUNCTION()
	UE_API void OnControllerChangedTeam(UObject* TeamAgent, int32 OldTeam, int32 NewTeam);

private:
	UPROPERTY(ReplicatedUsing = OnRep_MyTeamID)
	FGenericTeamId MyTeamID; // 我的团队ID

	UPROPERTY()
	FOnLyraTeamIndexChangedDelegate OnTeamChangedDelegate; // 团队改变委托

private:
	/**
	 * 我的团队ID复制时调用
	 */
	UFUNCTION()
	UE_API void OnRep_MyTeamID(FGenericTeamId OldTeamID);
};

#undef UE_API